package com.dava.helpmywife;

import java.util.List;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
import android.database.Cursor;
import android.net.Uri;
import android.os.Parcelable;
import android.util.Log;

/**
 * @author Dava
 * 
 */
public class Launcher {
	/**
	 * 读取数据库需要的权限
	 */
	private final static String READ_SETTINGS_PERMISSION = "com.android.launcher.permission.READ_SETTINGS";

	public static void createShortCut(Activity act, int iconResId,
			int appnameResId) {
		Launcher l = new Launcher();
		if (!l.hasShortcut(act, appnameResId)) {
			Intent shortcutintent = new Intent(
					"com.android.launcher.action.INSTALL_SHORTCUT");
			// 不允许重复创建 duplicate：重复的
			shortcutintent.putExtra("duplicate", false);
			Intent intent = new Intent();
			intent.setClass(act.getApplicationContext(), act.getClass());
			/* 以下两句是为了在卸载应用的时候同时删除桌面快捷方式 */
			intent.setAction("android.intent.action.MAIN");
			intent.addCategory("android.intent.category.LAUNCHER");
			// 需要现实的名称
			shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_NAME,
					act.getString(appnameResId));
			// 快捷图片
			Parcelable icon = Intent.ShortcutIconResource.fromContext(
					act.getApplicationContext(), iconResId);
			shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
			// 点击快捷图片，运行的程序主入口
			shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
			// 发送广播
			act.sendBroadcast(shortcutintent);
		}
	}

	/**
	 * 判断是否存在快捷方式
	 * */
	public boolean hasShortcut(Activity activity, int shortcutName) {
		try {
			String url = "";
			String AUTHORITY = getAuthorityFromPermission(activity,
					READ_SETTINGS_PERMISSION);

			final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
					+ "/favorites?notify=true");
			ContentResolver resolver = activity.getContentResolver();
			Cursor cursor = resolver.query(Uri.parse(url), null, "title=?",
					new String[] { activity.getString(shortcutName) }, null);
			if (cursor != null && cursor.moveToFirst()) {
				cursor.close();
				return true;
			}
			return false;
		} catch (Exception e) {
			return hasShortcut(activity.getApplicationContext());
		}

	}

	/**
	 * 当读取桌面快捷方式权限有问题时，执行该方法判断
	 * 
	 * @param context
	 * @return
	 */
	private static boolean hasShortcut(Context context) {
		try {
			boolean isInstallShortcut = false;
			Uri uri = null;
			if (android.os.Build.VERSION.SDK_INT < 8) {
				uri = Uri
						.parse("content://com.android.launcher.settings/favorites?notify=true");
			} else {
				uri = Uri
						.parse("content://com.android.launcher2.settings/favorites?notify=true");
			}
			Cursor c = context.getContentResolver()
					.query(uri,
							new String[] { "title", "iconResource" },
							"title=?",
							new String[] { context.getString(R.string.app_name)
									.trim() }, null);
			if (null != c && c.getCount() > 0) {
				isInstallShortcut = true;
			}

			return isInstallShortcut;
		} catch (Exception e) {
			return true;
		}

	}

	/**
	 * android系统桌面的基本信息由一个launcher.db的Sqlite数据库管理，里面有三张表
	 * 其中一张表就是favorites。这个db文件一般放在data
	 * /data/com.android.launcher(launcher2)文件的databases下 但是对于不同的rom会放在不同的地方
	 * 例如MIUI放在data/data/com.miui.home/databases下面
	 * htc放在data/data/com.htc.launcher/databases下面
	 * 
	 * @param context
	 * @param permission
	 *            读取设置的权限 READ_SETTINGS_PERMISSION
	 * @return
	 */
	private String getAuthorityFromPermission(Context context, String permission) {
		if (permission == null) {
			return null;
		}
		List<PackageInfo> packs = context.getPackageManager()
				.getInstalledPackages(PackageManager.GET_PROVIDERS);
		if (packs != null) {
			for (PackageInfo pack : packs) {
				ProviderInfo[] providers = pack.providers;
				if (providers != null) {
					for (ProviderInfo provider : providers) {
						if (permission.equals(provider.readPermission)
								|| permission.equals(provider.writePermission)) {
							return provider.authority;
						}
					}
				}
			}
		}
		return null;
	}

	/**
	 * 删除快捷方式
	 * */
	public void deleteShortCut(Activity activity, int shortcutName) {
		Intent shortcut = new Intent(
				"com.android.launcher.action.UNINSTALL_SHORTCUT");
		// 快捷方式的名称
		shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,
				activity.getText(shortcutName));
		// 在网上看到到的基本都是一下几句，测试的时候发现并不能删除快捷方式。
		// String appClass = activity.getPackageName()+"."+
		// activity.getLocalClassName();
		// ComponentName comp = new ComponentName( activity.getPackageName(),
		// appClass);
		// shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new
		// Intent(Intent.ACTION_MAIN).setComponent(comp));
		/** 改成以下方式能够成功删除，估计是删除和创建需要对应才能找到快捷方式并成功删除 **/
		Intent intent = new Intent();
		intent.setClass(activity, activity.getClass());
		intent.setAction("android.intent.action.MAIN");
		intent.addCategory("android.intent.category.LAUNCHER");
		shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
		activity.sendBroadcast(shortcut);
	}

}
